import threading
import time
"""
线程同步能够保证多个线程安全访问竞争资源，最简单的同步机制是引入互斥锁。

互斥锁为资源引入一个状态：锁定/非锁定

某个线程要更改共享数据时，先将其锁定，此时资源的状态为“锁定”，其他线程不能更改；
直到该线程释放资源，将资源的状态变成“非锁定”，其他的线程才能再次锁定该资源。
互斥锁保证了每次只有一个线程进行写入操作，从而保证了多线程情况下数据的正确性。

# 创建锁
mutex = threading.Lock()

# 锁定后会堵塞，直到这个锁被解锁为止
mutex.acquire()

# 释放
mutex.release()



锁的好处：
确保了某段关键代码只能由一个线程从头到尾完整地执行

锁的坏处：
阻止了多线程并发执行，包含锁的某段代码实际上只能以单线程模式执行，效率就大大地下降了
由于可以存在多个锁，不同的线程持有不同的锁，并试图获取对方持有的锁时，可能会造成死锁

"""

g_num = 0

def work1():
    global g_num
    for i in range(1000000):
        mutex.acquire() # 上锁
        g_num += 1
        mutex.release() # 解锁
    print("----in work1, g_num is %d---"%g_num)

def work2():
    global g_num
    for i in range(1000000):
        mutex.acquire() # 上锁
        g_num += 1
        mutex.release() # 解锁
    print("----in work2, g_num is %d---"%g_num)

# 创建一个互斥锁
mutex = threading.Lock()

t1 = threading.Thread(target=work1)
t1.start()

t2 = threading.Thread(target=work2)
t2.start()

# 等待计算完成
while len(threading.enumerate()) != 1:
    time.sleep(1)

print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)


